home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Java Primer Plus
/
Java Primer Plus (Waite Group Proess)(1996).iso
/
java_Win
/
demo
/
BouncingHeads
/
BounceItem.java
< prev
next >
Wrap
Text File
|
1995-10-13
|
7KB
|
259 lines
/*
* %W% %E%
*
* Copyright (c) 1994-1995 Sun Microsystems, Inc. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
* without fee is hereby granted.
* Please refer to the file http://java.sun.com/copy_trademarks.html
* for further important copyright and trademark information and to
* http://java.sun.com/licensing.html for further important licensing
* information for the Java (tm) Technology.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*
* THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
* CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
* PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
* NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
* SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
* SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
* PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). SUN
* SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
* HIGH RISK ACTIVITIES.
*/
import java.util.Hashtable;
import java.applet.*;
import java.io.*;
import java.awt.*;
import java.net.*;
/**
* @author Jonathan Payne
* @version %I%, %G%
*/
class BounceImage {
static float inelasticity = .96f;
static float Ax = 0.0f;
static float Ay = 0.0002f;
static float Ar = 0.9f;
public float x = 0;
public float y = 0;
public int width;
public int height;
public float Vx = 0.1f;
public float Vy = 0.05f;
public int index;
public float Vr = 0.005f + (float)Math.random() * 0.001f;
public float findex = 0f;
BounceItem parent;
static boolean imagesReadIn = false;
public void play(int n) {
if (parent.sounds[n] != null) {
parent.sounds[n].play();
}
}
public BounceImage(BounceItem parent) {
this.parent = parent;
width = 65;
height = 72;
}
public void move(float x1, float y1) {
x = x1;
y = y1;
}
public void paint(Graphics g) {
int i = index;
if (parent.bounceimages[i] == null) {
i = 0;
}
g.drawImage(parent.bounceimages[i], (int)x, (int)y, null);
}
public void step(long deltaT) {
boolean collision_x = false;
boolean collision_y = false;
float jitter = (float)Math.random() * .01f - .005f;
x += Vx * deltaT + (Ax / 2.0) * deltaT * deltaT;
y += Vy * deltaT + (Ay / 2.0) * deltaT * deltaT;
if (x <= 0.0f) {
x = 0.0f;
Vx = -Vx * inelasticity + jitter;
collision_x = true;
play((int)(Math.random() * 3));
}
Dimension d = parent.size();
if (x + width >= d.width) {
x = d.width - width;
Vx = -Vx * inelasticity + jitter;
collision_x = true;
play((int)(Math.random() * 3));
}
if (y <= 0) {
y = 0;
Vy = -Vy * inelasticity + jitter;
collision_y = true;
play((int)(Math.random() * 3));
}
if (y + height >= d.height) {
y = d.height - height;
Vx *= inelasticity;
Vy = -Vy * inelasticity + jitter;
collision_y = true;
}
move(x, y);
Vy = Vy + Ay * deltaT;
Vx = Vx + Ax * deltaT;
findex += Vr * deltaT;
if (collision_x || collision_y) {
Vr *= Ar;
}
while (findex <= 0.0) {
findex += parent.bounceimages.length;
}
index = ((int) findex) % parent.bounceimages.length;
}
}
public class BounceItem extends Applet implements Runnable {
boolean images_initialized = false;
BounceImage images[];
boolean time_to_die;
AudioClip music;
AudioClip sounds[];
Image bounceimages[];
public BounceItem() {
}
void makeImages(int nimages) {
bounceimages = new Image[8];
for (int i = 1 ; i <= 8 ; i++) {
bounceimages[i-1] = getImage(getCodeBase(), "images/jon/T" + i + ".gif");
//System.out.println("d = " + bounceimages[i-1].getWidth() + "," + bounceimages[i-1].getHeight());
}
images = new BounceImage[nimages];
for (int i = 0; i < nimages; i++) {
BounceImage img = images[i] = new BounceImage(this);
img.move(1 + img.width * .8f * (i % 3) + i / 3 * .3f * img.width,
img.height * .3f + (i % 3) * .3f * img.height);
}
sounds = new AudioClip[4];
sounds[0] = getAudioClip(getCodeBase(), "audio/ooh.au");
sounds[1] = getAudioClip(getCodeBase(), "audio/ah.au");
sounds[2] = getAudioClip(getCodeBase(), "audio/dah.au");
sounds[3] = getAudioClip(getCodeBase(), "audio/gong.au");
music = getAudioClip(getCodeBase(), "audio/spacemusic.au");
}
public void run() {
long lasttime;
try {
if (images == null) {
System.out.println("Making images ...");
makeImages(4);
}
if (music != null) {
music.loop();
}
lasttime = System.currentTimeMillis();
while (!time_to_die) {
int i;
long now = System.currentTimeMillis();
long deltaT = now - lasttime;
boolean active = false;
Dimension d = size();
for (i = 0; i < images.length; i++) {
BounceImage img = images[i];
img.step(deltaT);
if (img.Vy > .05 || -img.Vy > .05 || img.y + img.width < d.height - 10) {
active = true;
}
}
if (!active && images.length != 0) {
for (i = 0; i < images.length; i++) {
BounceImage img = images[i];
img.Vx = (float)Math.random() / 4.0f - 0.125f;
img.Vy = -(float)Math.random() / 4.0f - 0.2f;
img.Vr = 0.05f - (float)Math.random() * 0.1f;
}
if (sounds[3] != null) {
sounds[3].play();
}
}
repaint();
lasttime = now;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
return;
}
}
} finally {
if (music != null) {
music.stop();
}
}
}
public void init() {
Dimension d = size();
if ((d.width <= 100) || (d.height <= 100)) {
resize(500, 300);
}
}
public void start() {
time_to_die = false;
(new Thread(this)).start();
}
public void stop() {
time_to_die = true;
music.stop();
}
public void paint(Graphics g) {
Dimension d = size();
g.setColor(Color.gray);
g.drawRect(0, 0, d.width - 1, d.height - 1);
if (images != null) {
for (int i = 0; i < images.length; i++) {
if (images[i] != null) {
images[i].paint(g);
}
}
}
}
}